From bc93d6f1933eb6ea3e3899b585c93430b5306fa9 Mon Sep 17 00:00:00 2001 From: oliskoli Date: Sun, 21 Sep 2008 17:14:06 +0000 Subject: [PATCH] navitel: Add write support. --- gpsbabel/navitel.c | 70 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/gpsbabel/navitel.c b/gpsbabel/navitel.c index 806816c96..7b82d5c80 100644 --- a/gpsbabel/navitel.c +++ b/gpsbabel/navitel.c @@ -27,6 +27,8 @@ #define MYNAME "navitel" static gbfile *fin, *fout; +static char new_track; +static int trkpts; /******************************************************************************* * %%% global callbacks called by gpsbabel main process %%% * @@ -38,7 +40,7 @@ navitel_rd_init(const char *fname) fin = gbfopen(fname, "rb", MYNAME); } -static void +static void navitel_rd_deinit(void) { gbfclose(fin); @@ -49,21 +51,21 @@ navitel_read_track(void) { int points, i; route_head *trk = NULL; - + points = gbfgetint32(fin); (void) gbfgetint32(fin); /* unknown */ - + for (i = 0; i < points; i++) { int lat, lon; waypoint *wpt; - + lon = gbfgetint32(fin); lat = gbfgetint32(fin); - + wpt = waypt_new(); wpt->latitude = GPS_Math_Semi_To_Deg(lat & 0x7FFFFFFF); wpt->longitude = GPS_Math_Semi_To_Deg(lon); - + if ((lat >> 31) || (trk == NULL)) { trk = route_head_alloc(); track_add_head(trk); @@ -84,28 +86,68 @@ navitel_wr_deinit(void) gbfclose(fout); } +static void +navitel_enum_trkpts(const waypoint *wpt) +{ + trkpts++; +} + +static void +navitel_disp_trk_head(const route_head *trk) +{ + new_track = 1; +} + +static void +navitel_disp_trkpts(const waypoint *wpt) +{ + int lat, lon; + + lat = GPS_Math_Deg_To_Semi(wpt->latitude); + lon = GPS_Math_Deg_To_Semi(wpt->longitude); + + if (new_track) { + lat |= (1 << 31); + new_track = 0; + } + + gbfputint32(lon, fout); + gbfputint32(lat, fout); +} + static void navitel_write_track(void) { + trkpts = 0; + track_disp_all(NULL, NULL, navitel_enum_trkpts); + if (trkpts > 10000) { + trkpts = 10000; + warning(MYNAME ": Can store only 10000 points per file!\n"); + } + + gbfputint32(trkpts, fout); + gbfputint32(1, fout); /* ? */ + track_disp_all(navitel_disp_trk_head, NULL, navitel_disp_trkpts); } /**************************************************************************/ ff_vecs_t navitel_trk_vecs = { ff_type_file, - { - ff_cap_none /* waypoints */, - ff_cap_read /* tracks */, - ff_cap_none /* routes */ + { + ff_cap_none /* waypoints */, + ff_cap_read | ff_cap_write /* tracks */, + ff_cap_none /* routes */ }, - navitel_rd_init, - navitel_wr_init, - navitel_rd_deinit, - navitel_wr_deinit, + navitel_rd_init, + navitel_wr_init, + navitel_rd_deinit, + navitel_wr_deinit, navitel_read_track, navitel_write_track, NULL, NULL, CET_CHARSET_UTF8, 1 /* Nothing to convert */ }; + /**************************************************************************/ -- 2.30.2